home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / incl / LEDA.020+881 / graph.h < prev    next >
C/C++ Source or Header  |  1994-08-05  |  31KB  |  1,098 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  graph.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_GRAPH_H
  16. #define LEDA_GRAPH_H
  17.  
  18. //------------------------------------------------------------------------------
  19. //   directed graphs
  20. //   
  21. //   Redesign: November 1993
  22. //------------------------------------------------------------------------------
  23.  
  24.  
  25. #include <LEDA/basic.h>
  26. #include <LEDA/list.h>
  27. #include <LEDA/impl/olist.h>
  28.  
  29.  
  30. class node_struct;
  31. typedef node_struct* node;
  32.  
  33. class edge_struct;
  34. typedef edge_struct* edge;
  35.  
  36. class adj_link_struct1 : public obj_link {};
  37. typedef adj_link_struct1* adj_link1;
  38.  
  39. class adj_link_struct2 : public obj_link {};
  40. typedef adj_link_struct2* adj_link2;
  41.  
  42. class node_link_struct : public obj_link {};
  43. typedef node_link_struct* node_link;
  44.  
  45. class edge_link_struct : public obj_link {};
  46. typedef edge_link_struct* edge_link;
  47.  
  48. class aux_link_struct : public obj_link {};
  49. typedef aux_link_struct* aux_link;
  50.  
  51.  
  52. typedef int  (*cmp_graph_node) (const node&, const node&);
  53. typedef int  (*cmp_graph_edge) (const edge&, const edge&);
  54.  
  55.  
  56. //------------------------------------------------------------------------------
  57. // class node_struct: internal representation of nodes
  58. //------------------------------------------------------------------------------
  59.  
  60. class node_struct : public aux_link_struct,  // used for node_list
  61.                     public node_link_struct  // chaining all nodes
  62. {  
  63.  
  64.    friend class graph;
  65.    friend class ugraph;
  66.    friend class planar_map;
  67.    friend class node_stack;
  68.    friend class node_queue;
  69.    friend class node_list;
  70.    friend class b_node_pq;
  71.    //friend class node_data;
  72.    //friend class node_pq;
  73.  
  74.    
  75.    graph*    g;             // pointer to graph of node 
  76.    int       name;          // internal name (index)  
  77.    obj_list  adj_edges[2];  // lists of adjacent and incoming edges
  78.    edge      adj_iterator; //
  79.  
  80. public:
  81.  
  82.    GenPtr data[3];      // data[0]: GRAPH
  83.                         // data[1]: node_stack, node_queue, node_pq, etc.
  84.                         // data[2]: node_data
  85.  
  86.    node_struct(GenPtr i=0) 
  87.    { data[0] = i; name = -1; g = nil; adj_iterator = nil; }
  88.  
  89. LEDA_MEMORY(node_struct)
  90.  
  91. FRIEND_INLINE graph* graph_of(node);
  92. FRIEND_INLINE graph* graph_of(edge);
  93. FRIEND_INLINE int    indeg(node);
  94. FRIEND_INLINE int    outdeg(node);
  95. FRIEND_INLINE int    degree(node);
  96. FRIEND_INLINE int    index(node);
  97.  
  98. FRIEND_INLINE edge   First_Adj_Edge(node,int);
  99. FRIEND_INLINE edge   Last_Adj_Edge(node,int);
  100.  
  101. friend void init_node_data(const graph&,int,GenPtr);
  102.  
  103. };
  104.  
  105.  
  106.  
  107. //------------------------------------------------------------------------------
  108. // class edge_struct: internal representation of edges
  109. //------------------------------------------------------------------------------
  110.  
  111. class edge_struct : public adj_link_struct1,  // chaining of adjacent out-edges
  112.                     public adj_link_struct2,  // chaining of adjacent in-edges
  113.                     public edge_link_struct   // chaining of all edges
  114.    friend class graph;
  115.    friend class ugraph;
  116.    friend class planar_map;
  117.  
  118.    int  name;          // internal name (index)  
  119.    node s;             // source node 
  120.    node t;             // target node
  121.    edge rev;           // space for reverse edge (used by planar_map)
  122.  
  123.    GenPtr data[1];     // space for data (data[0] used by GRAPH)
  124.  
  125.    edge_struct(node v, node w, GenPtr i=0)
  126.    { data[0] = i;
  127.      name = -1;
  128.      s = v;
  129.      t = w;
  130.    }
  131.  
  132. public:
  133.  
  134. LEDA_MEMORY(edge_struct)
  135.  
  136. FRIEND_INLINE graph* graph_of(edge);
  137. FRIEND_INLINE node   source(edge);
  138. FRIEND_INLINE node   opposite(node,edge);
  139. FRIEND_INLINE node   target(edge);
  140. FRIEND_INLINE int    index(edge);
  141.  
  142. };
  143.  
  144.  
  145. inline int    outdeg(node v) { return v->adj_edges[0].length(); }
  146. inline int    indeg(node v)  { return v->adj_edges[1].length(); }
  147. inline int    degree(node v) { return indeg(v) + outdeg(v); }
  148.  
  149. inline int    index(node v)    { return v->name;    }
  150. inline graph* graph_of(node v) { return v->g; }
  151.  
  152. inline graph* graph_of(edge e) { return e->s->g;   }
  153. inline node   source(edge e)   { return e->s;      }
  154. inline node   opposite(node v, edge e) { return (v==e->s) ? e->t : e->s; }
  155.  
  156. inline node   target(edge e)   { return e->t;      }
  157. inline int    index(edge e)    { return e->name;    }
  158.  
  159.  
  160. // parameterized access of adjacent edges (portable code?)
  161. // outgoing (i=0) or incoming (i=1) edges
  162.  
  163. inline edge First_Adj_Edge(node v, int i)  
  164. { GenPtr p = v->adj_edges[i].first() - i;
  165.   return edge(p); }
  166.  
  167. inline edge Last_Adj_Edge(node v, int i)  
  168. { GenPtr p = v->adj_edges[i].last() - i;
  169.   return edge(p); }
  170.  
  171. inline edge Succ_Adj_Edge(edge e, int i) 
  172. { GenPtr p = ((obj_link*)(((obj_link*)GenPtr(e))+i))->succ_item() - i;
  173.   return edge(p); }
  174.  
  175. inline edge Pred_Adj_Edge(edge e, int i) 
  176. { GenPtr p = ((obj_link*)(((obj_link*)GenPtr(e))+i))->pred_item() - i;
  177.   return edge(p); }
  178.  
  179. inline edge Leda_Nil_Edge(int i) 
  180. { GenPtr p = (obj_link*)0 - i;
  181.   return edge(p); }
  182.  
  183.  
  184.  
  185.  
  186.  
  187. //------------------------------------------------------------------------------
  188. // graph_array<node/edge>
  189. //
  190. // base class for node and edge arrays
  191. //
  192. //------------------------------------------------------------------------------
  193.  
  194. template <class itype>
  195.  
  196. class _CLASSTYPE graph_array {
  197.  
  198. graph* g;     // array is declared for graph *g 
  199.  
  200. int mx_i;    // maximal node index in g at time of creation
  201.  
  202. protected:
  203.  
  204. GenPtr* arr;  
  205.  
  206. virtual void clear_entry(GenPtr&) const {}
  207. virtual void copy_entry(GenPtr&)  const {}
  208.  
  209. public:
  210.  
  211. virtual int cmp_entry(itype,itype) const  { return 0; }
  212.  
  213.  GenPtr& entry(itype x)
  214.  { if (g != graph_of(x) || index(x) > mx_i)
  215.           error_handler(102,"(node/edge)_array[x]: not defined for x");
  216.   return arr[index(x)];
  217.  }
  218.  
  219.  GenPtr  inf(itype x) const
  220.  { if (g != graph_of(x) || index(x) > mx_i)
  221.           error_handler(102,"(node/edge)_array[x]: not defined for x");
  222.   return arr[index(x)];
  223.  }
  224.  
  225.  GenPtr& entry(int i) { return arr[i]; }
  226.  
  227.  void init(const graph&, int, GenPtr);
  228.  void init(const graph_array<itype>&);
  229.  
  230.  void clear();
  231.  int  size() const     { return mx_i+1;}
  232.  
  233.  graph_array() { g = 0; mx_i = -1; arr = 0;}
  234.  
  235.  virtual ~graph_array() { clear(); }
  236.  
  237. };
  238.  
  239.  
  240. //------------------------------------------------------------------------------
  241. // graph: base class for all graphs
  242. //------------------------------------------------------------------------------
  243.  
  244. class graph {
  245.  
  246. friend class ugraph;
  247. friend class planar_map;
  248.  
  249. //list<node> V;              /* list of all nodes */
  250. obj_list V;
  251.  
  252. //list<edge> E;              /* list of all edges */
  253. obj_list E;
  254.  
  255. int max_n_index;      // maximal node index 
  256. int max_e_index;      // maximal edge index
  257.  
  258. bool   undirected;    // true iff graph is undirected
  259.  
  260.  
  261. /* space: 2 lists + 4 words + "virtual" = 2*20 + 5*4 bytes = 60 bytes */
  262.  
  263. virtual void init_node_entry(GenPtr& x)  { x=0; }
  264. virtual void init_edge_entry(GenPtr& x)  { x=0; }
  265.  
  266. virtual void copy_node_entry(GenPtr&) const {}
  267. virtual void copy_edge_entry(GenPtr&) const {}
  268.  
  269. virtual void clear_node_entry(GenPtr& x) const { x=0; }
  270. virtual void clear_edge_entry(GenPtr& x) const { x=0; }
  271.  
  272. virtual void read_node_entry(istream& in, GenPtr& x)  { Read(x,in); }
  273. virtual void read_edge_entry(istream& in, GenPtr& x)  { Read(x,in); }
  274.  
  275. virtual void write_node_entry(ostream& o, GenPtr& x)  const { Print(x,o); }
  276. virtual void write_edge_entry(ostream& o, GenPtr& x)  const { Print(x,o); }
  277.  
  278. virtual void print_node_entry(ostream&, GenPtr&)  const {}
  279. virtual void print_edge_entry(ostream&, GenPtr&)  const {}
  280.  
  281. virtual char* node_type()  const { return "void"; }
  282. virtual char* edge_type()  const { return "void"; }
  283.  
  284. protected:
  285.  
  286. graph* parent;           // for subgraphs
  287.  
  288.  
  289. void copy_all_entries() const;
  290. void clear_all_entries() const;
  291.  
  292. public:
  293.  
  294. virtual int cmp_node_entry(node, node) const { return 0; }
  295. virtual int cmp_edge_entry(edge, edge) const { return 0; }
  296.  
  297.    int adj_edges_select() { return undirected ? 1 : 0; }
  298.  
  299.    int  space() const;
  300.    void reset() const;
  301.  
  302.  
  303.    int  indeg(node v)     const;
  304.    int  outdeg(node v)    const;
  305.    int  degree(node v)    const;
  306.    node source(edge e)    const;
  307.    node target(edge e)    const;
  308.    node opposite(node v, edge e) const;
  309.  
  310.    graph* super()        const;
  311.  
  312.    int max_i(node)       const;
  313.    int max_i(edge)       const;
  314.    int max_node_index()  const;
  315.    int max_edge_index()  const;
  316.  
  317.    int  number_of_nodes() const;
  318.    int  number_of_edges() const;
  319.  
  320.    list<edge> all_edges()     const;
  321.    list<node> all_nodes()     const;
  322.    list<edge> adj_edges(node) const;
  323.    list<node> adj_nodes(node) const;
  324.  
  325.    GenPtr& entry(node v);
  326.    GenPtr& entry(edge e);
  327.    GenPtr  inf(node v) const;
  328.    GenPtr  inf(edge e) const;
  329.  
  330. int int_inf(edge e) const { return int(e->data[0]); }
  331.  
  332.  
  333.    void init_adj_iterator(node v)        const;
  334.    bool next_adj_edge(edge& e,node v)    const;
  335.    bool current_adj_edge(edge& e,node v) const;
  336.    bool next_adj_node(node& w,node v)    const;
  337.    bool current_adj_node(node& w,node v) const;
  338.  
  339.    void init_node_iterator() const {}
  340.    void init_edge_iterator() const {}
  341.    
  342.    node first_node()      const;
  343.    node last_node()       const;
  344.    node choose_node()     const;
  345.    node succ_node(node v) const;
  346.    node pred_node(node v) const;
  347.  
  348.    edge first_edge()      const;
  349.    edge last_edge()       const;
  350.    edge choose_edge()     const;
  351.    edge succ_edge(edge e) const;
  352.    edge pred_edge(edge e) const;
  353.  
  354.    edge first_adj_edge(node v) const;
  355.    edge last_adj_edge(node v)  const;
  356.    edge adj_succ(edge e)  const;
  357.    edge adj_pred(edge e)  const;
  358.    edge cyclic_adj_succ(edge e) const;
  359.    edge cyclic_adj_pred(edge e) const;
  360.  
  361.    edge first_in_edge(node v)  const;
  362.    edge last_in_edge(node v)   const;
  363.    edge in_succ(edge e)  const;
  364.    edge in_pred(edge e)  const;
  365.    edge cyclic_in_succ(edge e) const;
  366.    edge cyclic_in_pred(edge e) const;
  367.  
  368. protected:
  369.  
  370.    node new_node(GenPtr);
  371.    edge new_edge(node, node, GenPtr);
  372.    edge new_edge(edge, node, GenPtr, int dir=0);
  373.    edge new_edge(edge, edge, GenPtr, int dir1=0, int dir2=0);
  374.  
  375.    void assign(node v,GenPtr x);
  376.    void assign(edge e,GenPtr x);
  377.  
  378. public:
  379.  
  380.    node new_node()   { GenPtr x; init_node_entry(x);  
  381.                        return new_node(x); }
  382.  
  383.    edge new_edge(node v, node w) 
  384.    { GenPtr x; init_edge_entry(x);
  385.      return new_edge(v,w,x);}
  386.  
  387.    edge new_edge(edge e, node w, int dir=0) 
  388.    { GenPtr x; init_edge_entry(x);
  389.      return new_edge(e,w,x,dir); }
  390.  
  391.    edge new_edge(edge e1, edge e2, int dir1=0, int dir2=0) 
  392.    { GenPtr x; init_edge_entry(x);
  393.      return new_edge(e1,e2,x,dir1,dir2); }
  394.  
  395.    void hide_edge(edge);
  396.    void restore_edge(edge);
  397.  
  398.    void del_node(node);
  399.    void del_edge(edge);
  400.    void del_all_nodes(); 
  401.    void del_all_edges(); 
  402.  
  403.    list<edge> insert_reverse_edges();
  404.  
  405.    void sort_nodes(cmp_graph_node);
  406.    void sort_edges(cmp_graph_edge);
  407.  
  408.    void sort_nodes(const graph_array<node>&);
  409.    void sort_edges(const graph_array<edge>&);
  410.  
  411.    void sort_edges();
  412.    void sort_nodes();
  413.  
  414.    edge rev_edge(edge);
  415.    graph& rev();
  416.  
  417.    void make_undirected() { undirected = true; }
  418.    void make_directed()   { undirected = false; }
  419.  
  420.    void write(ostream& = cout) const;
  421.    void write(string) const;
  422.  
  423.    int  read(istream& = cin);
  424.    int  read(string);
  425.  
  426.    void print_node(node,ostream& = cout)  const;
  427.  
  428. virtual void print_edge(edge,ostream& = cout) const;
  429.  
  430.    void print(string s, ostream& = cout) const;
  431.  
  432.    void print()           const { print("");   }
  433.    void print(ostream& o) const { print("",o); }
  434.  
  435. virtual void clear();
  436.  
  437.    graph();
  438.    graph(const graph&);
  439.    graph& operator=(const graph&); 
  440.  
  441. virtual ~graph(){ clear(); }
  442.  
  443.  
  444.    //subgraph constructors
  445.  
  446.    graph(graph&, const list<node>&, const list<edge>&);
  447.    graph(graph&, const list<edge>&);
  448.  
  449. };
  450.  
  451. inline int  graph::outdeg(node v) const { return v->adj_edges[0].length(); }
  452. inline int  graph::indeg(node v)  const { return v->adj_edges[1].length(); }
  453. inline int  graph::degree(node v) const { return outdeg(v) + indeg(v); }
  454.  
  455. inline node graph::source(edge e)    const   { return e->s; }
  456. inline node graph::target(edge e)    const   { return e->t; }
  457. inline node graph::opposite(node v,edge e) const {return (v==e->s)?e->t:e->s;}
  458.  
  459. inline graph* graph::super()       const   { return parent; }
  460. inline int graph::max_i(node)      const   { return max_n_index; }
  461. inline int graph::max_i(edge)      const   { return max_e_index; }
  462. inline int graph::max_node_index() const   { return max_n_index; }
  463. inline int graph::max_edge_index() const   { return max_e_index; }
  464.  
  465. inline int  graph::number_of_nodes() const   { return V.length(); }
  466. inline int  graph::number_of_edges() const   { return E.length(); }
  467.  
  468. inline GenPtr& graph::entry(node v)        { return v->data[0]; }
  469. inline GenPtr& graph::entry(edge e)        { return e->data[0]; }
  470. inline void graph::assign(node v,GenPtr x) { v->data[0] = x; }
  471. inline void graph::assign(edge e,GenPtr x) { e->data[0] = x; }
  472.  
  473. inline GenPtr  graph::inf(node v) const { return v->data[0]; }
  474. inline GenPtr  graph::inf(edge e) const { return e->data[0]; }
  475.  
  476.  
  477. inline node graph::first_node()   const { return node(node_link(V.first())); }
  478. inline node graph::last_node()    const { return node(node_link(V.last())); }
  479. inline node graph::choose_node()  const { return first_node(); }
  480.  
  481. inline node graph::succ_node(node v)  const  
  482. { return node(node_link(V.succ(node_link(v)))); }
  483.  
  484. inline node graph::pred_node(node v)  const  
  485. { return node(node_link(E.pred(node_link(v)))); }
  486.  
  487.  
  488. inline edge graph::first_edge()   const { return edge(edge_link(E.first())); }
  489. inline edge graph::last_edge()    const { return edge(edge_link(E.last())); }
  490. inline edge graph::choose_edge()  const { return first_edge(); }
  491.  
  492. inline edge graph::succ_edge(edge e)  const  
  493. { return edge(edge_link(E.succ(edge_link(e)))); }
  494.  
  495. inline edge graph::pred_edge(edge e)  const  
  496. { return edge(edge_link(E.pred(edge_link(e)))); }
  497.  
  498.  
  499.  
  500. inline edge graph::first_adj_edge(node v) const
  501. { return edge(adj_link1(v->adj_edges[0].first())); }
  502.  
  503. inline edge graph::last_adj_edge(node v)  const
  504. { return edge(adj_link1(v->adj_edges[0].last())); }
  505.  
  506. inline edge graph::adj_succ(edge e)  const
  507. { return edge(adj_link1(adj_link1(e)->succ_item())); }
  508.  
  509. inline edge graph::adj_pred(edge e)  const
  510. { return edge(adj_link1(adj_link1(e)->pred_item())); }
  511.  
  512. inline edge graph::cyclic_adj_succ(edge e) const 
  513. { edge e1 = adj_succ(e);
  514.   return e1 ? e1 : first_adj_edge(e->s); }
  515.  
  516. inline edge graph::cyclic_adj_pred(edge e) const 
  517. { edge e1 = adj_pred(e);
  518.   return e1 ? e1 : last_adj_edge(e->s); }
  519.  
  520.  
  521.  
  522. inline edge graph::first_in_edge(node v) const
  523. { return edge(adj_link2(v->adj_edges[1].first())); }
  524.  
  525. inline edge graph::last_in_edge(node v)  const
  526. { return edge(adj_link2(v->adj_edges[1].last())); }
  527.  
  528. inline edge graph::in_succ(edge e)  const
  529. { return edge(adj_link2(adj_link2(e)->succ_item())); }
  530.  
  531. inline edge graph::in_pred(edge e)  const
  532. { return edge(adj_link2(adj_link2(e)->pred_item())); }
  533.  
  534. inline edge graph::cyclic_in_succ(edge e) const 
  535. { edge e1 = in_succ(e);
  536.   return e1 ? e1 : first_in_edge(e->s); }
  537.  
  538. inline edge graph::cyclic_in_pred(edge e) const 
  539. { edge e1 = in_pred(e);
  540.   return e1 ? e1 : last_in_edge(e->s); }
  541.  
  542.  
  543.  
  544. inline void graph::init_adj_iterator(node v) const 
  545. { v->adj_iterator = nil; }
  546.  
  547. inline bool  graph::current_adj_edge(edge& e,node v) const 
  548. { return (e = v->adj_iterator) != nil;}
  549.  
  550. inline bool  graph::next_adj_edge(edge& e,node v) const 
  551. { if (v->adj_iterator) 
  552.       e = v->adj_iterator = adj_succ(v->adj_iterator);
  553.   else
  554.       e = v->adj_iterator = first_adj_edge(v);
  555.   return  (e) ? true : false;
  556.  }
  557.  
  558. inline bool graph::next_adj_node(node& w,node v)  const
  559. { edge e;
  560.   if (next_adj_edge(e,v))
  561.   { //w = (v==e->s) ? e->t : e->s;  // ugraph
  562.     w = e->t;
  563.     return true; 
  564.    }
  565.   else return false;
  566.  }
  567.    
  568. inline bool graph::current_adj_node(node& w,node v)  const
  569. { edge e;
  570.   if (current_adj_edge(e,v))
  571.   { //w = (v==e->s) ? e->t : e->s;  // ugraph
  572.     w = e->t;
  573.     return true; 
  574.    }
  575.   else return false;
  576. }
  577.    
  578.  
  579. //------------------------------------------------------------------------------
  580. // Iteration   (macros)
  581. //------------------------------------------------------------------------------
  582.  
  583. #define forall_nodes(v,g) for (v=(g).first_node(); v; v=(g).succ_node(v) )
  584. #define forall_edges(e,g) for (e=(g).first_edge(); e; e=(g).succ_edge(e) )
  585.  
  586. #define Forall_nodes(v,g) for (v=(g).last_node(); v; v=(g).pred_node(v) )
  587. #define Forall_edges(e,g) for (e=(g).last_edge(); e; e=(g).pred_edge(e) )
  588.  
  589.  
  590. #define forall_out_edges(e,v)\
  591. for(e = First_Adj_Edge(v,0); e != Leda_Nil_Edge(0); e = Succ_Adj_Edge(e,0))
  592.  
  593. #define forall_in_edges(e,v)\
  594. for(e = First_Adj_Edge(v,1); e != Leda_Nil_Edge(1); e = Succ_Adj_Edge(e,1))
  595.  
  596. #define ADJ_BREAK { adj_loop_index = -1; break; }
  597.  
  598. #define forall_inout_edges(e,v)\
  599. for(LEDA::loop_dummy = 0; LEDA::loop_dummy < 1; LEDA::loop_dummy++)\
  600. for(int adj_loop_index = 1; adj_loop_index>=0; adj_loop_index--)\
  601. for(e = First_Adj_Edge(v,adj_loop_index);\
  602. e != Leda_Nil_Edge(adj_loop_index);\
  603. e = Succ_Adj_Edge(e,adj_loop_index))
  604.  
  605. #define forall_adj_edges(e,v)\
  606. for(LEDA::loop_dummy = 0; LEDA::loop_dummy < 1; LEDA::loop_dummy++)\
  607. for(int adj_loop_index = graph_of(v)->adj_edges_select(); adj_loop_index>=0; adj_loop_index--)\
  608. for(e = First_Adj_Edge(v,adj_loop_index);\
  609. e != Leda_Nil_Edge(adj_loop_index);\
  610. e = Succ_Adj_Edge(e,adj_loop_index))
  611.  
  612. #define forall_adj_nodes(u,v)\
  613. for(LEDA::loop_dummy = 0; LEDA::loop_dummy < 1; LEDA::loop_dummy++)\
  614. for(int adj_loop_index = graph_of(v)->adj_edges_select(); adj_loop_index>=0; adj_loop_index--)\
  615. for(edge adj_loop_e = First_Adj_Edge(v,adj_loop_index);\
  616. (adj_loop_e!=Leda_Nil_Edge(adj_loop_index))&&((u=opposite(v,adj_loop_e))||1);\
  617. adj_loop_e = Succ_Adj_Edge(adj_loop_e,adj_loop_index))
  618.  
  619.  
  620.  
  621.  
  622. //------------------------------------------------------------------------------
  623. // GRAPH<vtype,etype> : parameterized directed graphs
  624. //------------------------------------------------------------------------------
  625.  
  626.  
  627. template<class vtype, class etype> 
  628.  
  629. class _CLASSTYPE GRAPH : public graph {
  630.  
  631. vtype X;
  632. etype Y;
  633.  
  634. void copy_node_entry(GenPtr& x) const  { x=Copy(ACCESS(vtype,x)); }
  635. void copy_edge_entry(GenPtr& x) const  { x=Copy(ACCESS(etype,x)); }
  636.  
  637. void clear_node_entry(GenPtr& x) const { Clear(ACCESS(vtype,x)); }
  638. void clear_edge_entry(GenPtr& x) const { Clear(ACCESS(etype,x)); }
  639.  
  640. void write_node_entry(ostream& o, GenPtr& x) const {Print(ACCESS(vtype,x),o);}
  641. void write_edge_entry(ostream& o, GenPtr& x) const {Print(ACCESS(etype,x),o);}
  642.  
  643. void read_node_entry(istream& i, GenPtr& x) { Read(X,i); x=Copy(X); }
  644. void read_edge_entry(istream& i, GenPtr& x) { Read(Y,i); x=Copy(Y); }
  645.  
  646. void init_node_entry(GenPtr& x) { Init(X); x = Copy(X); }
  647. void init_edge_entry(GenPtr& x) { Init(Y); x = Copy(Y); }
  648.  
  649. void print_node_entry(ostream& o, GenPtr& x)  const
  650.      { o << "("; Print(ACCESS(vtype,x),o); o << ")"; }
  651. void print_edge_entry(ostream& o, GenPtr& x)  const
  652.      { o << "("; Print(ACCESS(etype,x),o); o << ")"; }
  653.  
  654. char* node_type()  const { return TYPE_NAME(vtype); }
  655. char* edge_type()  const { return TYPE_NAME(etype); }
  656.  
  657. public:
  658.  
  659. int cmp_node_entry(node x, node y) const { return compare(inf(x),inf(y)); }
  660. int cmp_edge_entry(edge x, edge y) const { return compare(inf(x),inf(y)); }
  661.  
  662. vtype  inf(node v)    const   { return ACCESS(vtype,graph::inf(v)); }
  663. etype  inf(edge e)    const   { return ACCESS(etype,graph::inf(e)); }
  664.  
  665. vtype& operator[] (node v)    { return ACCESS(vtype,entry(v)); }
  666. etype& operator[] (edge e)    { return ACCESS(etype,entry(e)); }
  667. vtype  operator[] (node v) const   { return ACCESS(vtype,graph::inf(v)); }
  668. etype  operator[] (edge e) const   { return ACCESS(etype,graph::inf(e)); }
  669.  
  670. void   assign(node v,vtype x) { operator[](v) = x; }
  671. void   assign(edge e,etype x) { operator[](e) = x; }
  672.  
  673. node   new_node()               { return graph::new_node(); }
  674. node   new_node(vtype a)        { return graph::new_node(Copy(a)); }
  675.  
  676. edge   new_edge(node v, node w) { return graph::new_edge(v,w); }
  677. edge   new_edge(node v, node w, etype a)
  678.                                 { return graph::new_edge(v,w,Copy(a)); }
  679. edge   new_edge(edge e, node w) { return graph::new_edge(e,w); }
  680. edge   new_edge(edge e, node w, etype a)
  681.                                 { return graph::new_edge(e,w,Copy(a),0); }
  682. edge   new_edge(edge e, node w, etype a, int dir)
  683.                                 { return graph::new_edge(e,w,Copy(a),dir); }
  684.  
  685. void   clear()                  { clear_all_entries(); graph::clear(); }
  686.  
  687. GRAPH<vtype,etype>& operator=(const GRAPH<vtype,etype>& a)
  688. { clear_all_entries();graph::operator=(a);copy_all_entries();return *this; }
  689.  
  690. GRAPH()  {}
  691. GRAPH(const GRAPH<vtype,etype>& a) : graph(a) { a.copy_all_entries(); } 
  692.  
  693. /* subgraphs */
  694. GRAPH(GRAPH<vtype,etype>& a, const list<node>& b, const list<edge>& c) 
  695.                                                   : graph(a,b,c) {}
  696.  
  697. GRAPH(GRAPH<vtype,etype>& a, const list<edge>& c) : graph(a,c) {}
  698.  
  699. virtual ~GRAPH()   { if (parent==0) clear_all_entries(); }
  700.  
  701. };
  702.  
  703.  
  704. //------------------------------------------------------------------------------
  705. // node_list
  706. //------------------------------------------------------------------------------
  707.  
  708. class node_list : public c_obj_list
  709. {
  710.   node iterator;
  711.  
  712. public:
  713.  
  714.   static void del_node(node v) { aux_link(v)->del_item(); }
  715.  
  716.   void append(node v) { c_obj_list::append(aux_link(v)); }
  717.   void push(node v)   { c_obj_list::push(aux_link(v)); }
  718.   void insert(node v, node w) 
  719.                       { c_obj_list::insert(aux_link(v),aux_link(w)); }
  720.   node pop()          { return node(aux_link(c_obj_list::pop())); }
  721.   void del(node v)    { c_obj_list::del(aux_link(v)); }
  722.  
  723.   bool member(node v)  const { return aux_link(v)->succ_link != nil; }
  724.   bool operator()(node v) const { return member(v); }
  725.  
  726.   node first()const { return node(aux_link(c_obj_list::first())); }
  727.   node last() const { return node(aux_link(c_obj_list::last()));  }
  728.   node head() const { return node(aux_link(c_obj_list::first())); }
  729.   node tail() const { return node(aux_link(c_obj_list::last()));  }
  730.  
  731.   node succ(node v) const
  732.   { return node(aux_link(c_obj_list::succ(aux_link(v)))); }
  733.  
  734.   node pred(node v) const
  735.   { return node(aux_link(c_obj_list::pred(aux_link(v)))); }
  736.  
  737.   node cyclic_succ(node v) const
  738.   { return node(aux_link(c_obj_list::cyclic_succ(aux_link(v)))); }
  739.  
  740.   node cyclic_pred(node v) const
  741.   { return node(aux_link(c_obj_list::cyclic_pred(aux_link(v)))); }
  742.  
  743.   void start_iteration() const { (*(node*)&iterator)=first(); }
  744.   void move_to_succ() const { (*(node*)&iterator) = succ(iterator);}
  745.  
  746.   bool read_iterator(node& x) const { x = iterator; return x ? true : false; }
  747.  
  748.   node first_item() const { return first(); }
  749.   node last_item()  const { return last(); }
  750.  
  751.   GenPtr forall_loop_test(GenPtr x, node& v) const { return v = node(x); }
  752.  
  753.   void   loop_to_succ(GenPtr& x) const { x = succ(node(x)); }
  754.   void   loop_to_pred(GenPtr& x) const { x = pred(node(x)); }
  755.  
  756. };
  757.  
  758.  
  759.  
  760. //------------------------------------------------------------------------------
  761. // node_stack 
  762. //------------------------------------------------------------------------------
  763.  
  764. class node_stack {
  765.  
  766. node head;
  767.  
  768. public:
  769.  
  770. node_stack() { head = nil; }
  771.  
  772. void push(node v) { v->data[1] = head; head = v; }
  773. node pop()        { node v = head; head = node(v->data[1]); return v; }
  774. bool empty()      { return (head==nil) ? true : false; }  
  775. void clear()      { head = nil; }  
  776.  
  777. };
  778.  
  779.  
  780. //------------------------------------------------------------------------------
  781. // node_queue 
  782. //------------------------------------------------------------------------------
  783.  
  784. class node_queue {
  785.  
  786. node head;
  787. node tail;
  788.  
  789. public:
  790.  
  791. node_queue() { head = nil; }
  792.  
  793. void append(node v) 
  794. { v->data[1] = nil; 
  795.   if (head == nil) 
  796.      head = v;
  797.   else
  798.      tail->data[1] = v; 
  799.   tail = v; 
  800.  }
  801.  
  802. node pop()   { node v = head; head = node(v->data[1]); return v; }
  803. bool empty() { return (head==nil) ? true : false; }  
  804. void clear() { head = nil; }  
  805.  
  806. };
  807.  
  808.  
  809.  
  810.  
  811. //------------------------------------------------------------------------------
  812. // node_data 
  813. //------------------------------------------------------------------------------
  814.  
  815.  
  816. template <class T> class node_data {
  817.  
  818. public:
  819.  
  820. T& operator[](node v) { return (T&)v->data[2]; }
  821. T  operator()(node v) { return (T)v->data[2]; }
  822.  
  823. T    get(node v) { return (T)v->data[2]; }
  824. void set(node v,T x) { v->data[2] = GenPtr(x); }
  825.  
  826. node_data(const graph& G, T x) { init_node_data(G,2,GenPtr(x)); }
  827.  
  828. };
  829.  
  830.  
  831.  
  832. //------------------------------------------------------------------------------
  833. // node and edge arrays
  834. //------------------------------------------------------------------------------
  835.  
  836.  
  837. #if defined(LEDA_CHECKING_OFF)
  838. #define GRAPH_ARRAY_ACCESS(I,type)\
  839. type& operator[](I x)       { return ACCESS(type,arr[index(x)]); }\
  840. type  operator[](I x) const { return ACCESS(type,arr[index(x)]); }
  841. #else
  842. #define GRAPH_ARRAY_ACCESS(I,type)\
  843. type& operator[](I x)       { return ACCESS(type,entry(x));}\
  844. type  operator[](I x) const { return ACCESS(type,inf(x));}
  845. #endif
  846.  
  847.  
  848. //------------------------------------------------------------------------------
  849. // node arrays
  850. //------------------------------------------------------------------------------
  851.  
  852.  
  853. typedef graph_array<node>  node_graph_array;
  854.  
  855.  
  856. template<class type>
  857.  
  858. class _CLASSTYPE node_array : public node_graph_array {
  859.  
  860. type X;
  861.  
  862. void copy_entry(GenPtr& x) const { x=Copy(ACCESS(type,x));}
  863. void clear_entry(GenPtr& x)const { Clear(ACCESS(type,x)); }
  864.  
  865. public:
  866.  
  867.  
  868. int cmp_entry(node x,node y) const 
  869. { return compare(ACCESS(type,arr[index(x)]),ACCESS(type,arr[index(y)])); }
  870.  
  871. GRAPH_ARRAY_ACCESS(node,type)
  872.  
  873. type& elem(int i)              { return ACCESS(type,arr[i]);}
  874. type  elem(int i) const        { return ACCESS(type,arr[i]);}
  875.  
  876.  
  877.  
  878. void init(const graph& G, int n, type i) { node_graph_array::init(G,n,Convert(i)); }
  879.  
  880. #if defined(__ZTC__)
  881. void init(const graph& G);
  882. #else
  883. void init(const graph& G) { Init(X); init(G,X); }
  884. #endif
  885.  
  886. void init(const graph& G, type i)    { init(G,G.max_i(node(0))+1,i); }
  887. void init(const node_array<type>& A) { node_graph_array::init(A); }
  888.  
  889.  
  890. node_array() {}
  891. node_array(const graph& G)                 { init(G);   }
  892. node_array(const graph& G, int n, type i)  { init(G,n,i); }
  893. node_array(const graph& G, type i)         { init(G,i); }
  894. node_array(const node_array<type>& A)      { init(A);   }
  895.  
  896. node_array<type>& operator=(const node_array<type>& A) { init(A); return *this;}
  897.  
  898. ~node_array() { node_graph_array::clear(); }
  899.  
  900. };
  901.  
  902. #if defined (__ZTC__)
  903. template<class type>
  904. inline void  node_array<type>::init(const graph& G)  { Init(X); init(G,X); }
  905. #endif
  906.  
  907.  
  908.  
  909. /*
  910.  
  911. template<class type>
  912.  
  913. class _CLASSTYPE node_array1 {
  914.  
  915. graph* g;
  916. int sz; 
  917. type* arr;
  918.  
  919.  
  920. public:
  921.  
  922. #if defined(LEDA_CHECKING_OFF)
  923. type& operator[](node x)       { return arr[index(x)]; }
  924. type  operator[](node x) const { return arr[index(x)]; }
  925. #else
  926. type& operator[](node x)
  927.  { if (g != graph_of(x) || index(x) >= sz)
  928.           error_handler(102,"(node/edge)_array[x]: not defined for x");
  929.   return arr[index(x)];
  930.  }
  931.  type  operator[](node x) const
  932.  { if (g != graph_of(x) || index(x) >= sz)
  933.           error_handler(102,"(node/edge)_array[x]: not defined for x");
  934.   return arr[index(x)];
  935.  }
  936. #endif
  937.  
  938.  
  939.  
  940. void init(const graph& G, int n, type ini)
  941. { g = (graph*)&G;  
  942.   sz = n; 
  943.   arr = new type[sz];
  944.   for(int i = 0; i<sz; i++) arr[i] = ini;
  945.  }
  946.  
  947. void init(const graph& G, type ini)
  948. { g = (graph*)&G;  
  949.   sz = G.max_i(node(0))+1; 
  950.   arr = new type[sz];
  951.   for(int i = 0; i<sz; i++) arr[i] = ini;
  952. }
  953.  
  954. void init(const graph& G)
  955. { g = (graph*)&G;  
  956.   sz = G.max_i(node(0))+1; 
  957.   arr = new type[sz];
  958. }
  959.  
  960.  
  961. void init(const node_array1<type>& A) 
  962. { g = A.g;
  963.   sz = A.sz;
  964.   arr = new type[sz];
  965.   for(int i = 0; i<sz; i++) arr[i] = A.arr[i];
  966. }
  967.  
  968.  
  969. node_array1() {}
  970. node_array1(const graph& G)                 { init(G);   }
  971. //node_array1(const graph& G, int n)        { init(G,n); }
  972. node_array1(const graph& G, int n, type i)  { init(G,n,i); }
  973. node_array1(const graph& G, type i)         { init(G,i); }
  974. node_array1(const node_array1<type>& A)     { init(A);   }
  975. node_array1<type>& operator=(const node_array1<type>& A) 
  976. { init(A); return *this; }
  977.  
  978. ~node_array1() { delete[] arr; }
  979.  
  980. };
  981. */
  982.  
  983.  
  984. //------------------------------------------------------------------------------
  985. // edge arrays
  986. //------------------------------------------------------------------------------
  987.  
  988. typedef graph_array<edge>  edge_graph_array;
  989.  
  990.  
  991. template<class type>
  992.  
  993. class _CLASSTYPE edge_array : public edge_graph_array {
  994.  
  995. type X;
  996.  
  997. void copy_entry(GenPtr& x) const { x=Copy(ACCESS(type,x));}
  998. void clear_entry(GenPtr& x)const { Clear(ACCESS(type,x)); }
  999.  
  1000. public:
  1001.  
  1002. int cmp_entry(edge x,edge y) const 
  1003. { return compare(ACCESS(type,arr[index(x)]),ACCESS(type,arr[index(y)])); }
  1004.  
  1005. GRAPH_ARRAY_ACCESS(edge,type)
  1006.  
  1007. type& elem(int i)              { return ACCESS(type,arr[i]);}
  1008. type  elem(int i) const        { return ACCESS(type,arr[i]);}
  1009.  
  1010.  
  1011. void init(const graph& G, int n, type i) { edge_graph_array::init(G,n,Convert(i)); }
  1012.  
  1013. #if defined(__ZTC__)
  1014. void init(const graph& G);
  1015. #else
  1016. void init(const graph& G) { Init(X); init(G,X); }
  1017. #endif
  1018.  
  1019. void init(const graph& G, type i)        { init(G,G.max_i(edge(0))+1,i); }
  1020. void init(const edge_array<type>& A)     { edge_graph_array::init(A); }
  1021.  
  1022. edge_array() {}
  1023. edge_array(const graph& G)                 { init(G);   }
  1024. edge_array(const graph& G, int n, type i)  { init(G,n,i); }
  1025. edge_array(const graph& G, type i)         { init(G,i); }
  1026. edge_array(const edge_array<type>& A)      { init(A);   }
  1027.  
  1028. edge_array<type>& operator=(const edge_array<type>& A) { init(A); return *this;}
  1029.  
  1030. ~edge_array() { edge_graph_array::clear(); }
  1031.  
  1032. };
  1033.  
  1034. #if defined(__ZTC__)
  1035. template<class type>
  1036. inline void  edge_array<type>::init(const graph& G)  { Init(X); init(G,X); }
  1037. #endif
  1038.  
  1039.  
  1040.  
  1041.  
  1042.  
  1043. //-----------------------------------------------------------------------------
  1044. // graph generators
  1045. //-----------------------------------------------------------------------------
  1046.  
  1047. extern void complete_graph(graph&,int);
  1048. extern void random_graph(graph&,int,int);
  1049. extern void test_graph(graph&);
  1050.  
  1051. extern void complete_bigraph(graph&,int,int,list<node>&,list<node>&);
  1052. extern void random_bigraph(graph&,int,int,int,list<node>&,list<node>&);
  1053. extern void test_bigraph(graph&,list<node>&,list<node>&);
  1054.  
  1055.  
  1056. extern void random_planar_graph(graph&,node_array<double>& xcoord, 
  1057.                                        node_array<double>& ycoord, int n);
  1058. extern void random_planar_graph(graph&,int);
  1059.  
  1060.  
  1061. extern void triangulated_planar_graph(graph&,node_array<double>& xcoord, 
  1062.                                              node_array<double>& ycoord, int n);
  1063. extern void triangulated_planar_graph(graph& G, int n);
  1064.  
  1065.  
  1066. extern void grid_graph(graph&,node_array<double>& xcoord, 
  1067.                               node_array<double>& ycoord, int n);
  1068. extern void grid_graph(graph&,int);
  1069.  
  1070.  
  1071. extern void cmdline_graph(graph&,int,char**);
  1072.  
  1073.  
  1074.  
  1075. //-----------------------------------------------------------------------------
  1076. // miscellaneous  (should be member functions ?)
  1077. //-----------------------------------------------------------------------------
  1078.  
  1079. extern bool Is_Bidirected(const graph&, edge_array<edge>&);
  1080.  
  1081. extern bool Is_Simple(graph& G);
  1082.  
  1083. extern void Make_Simple(graph& G);
  1084.  
  1085.  
  1086.  
  1087. // for historical reasons
  1088.  
  1089. inline bool compute_correspondence(const graph& G, edge_array<edge>& rev)
  1090. { return Is_Bidirected(G,rev); }
  1091.  
  1092. inline void eliminate_parallel_edges(graph& G) { Make_Simple(G); }
  1093.  
  1094.  
  1095. #endif
  1096.